Article Title
Lorem ipsum dolor sit amet, consectetur adipiscing elit...
Дослідіть CSS Container Queries – наступний етап розвитку адаптивного дизайну. Дізнайтеся, як створювати компоненти, що адаптуються до розміру контейнера, а не лише до розміру вікна перегляду.
Адаптивний дизайн є наріжним каменем веб-розробки вже понад десять років. Традиційно ми покладалися на медіа-запити для адаптації наших макетів залежно від розміру вікна перегляду. Однак цей підхід іноді може здаватися обмежувальним, особливо при роботі зі складними компонентними дизайнами. На арену виходять CSS Container Queries – нова потужна функція, яка дозволяє компонентам адаптуватися на основі розміру їхнього контейнерного елемента, а не лише розміру вікна перегляду.
Контейнерні запити змінюють правила гри, оскільки вони дозволяють створювати адаптивний дизайн на основі елементів. Замість того, щоб питати "Який розмір екрана?", ви можете запитати "Скільки місця доступно для цього компонента?". Це відкриває світ можливостей для створення справді багаторазових та адаптованих компонентів.
Уявіть компонент картки, який може з'являтися в різних контекстах: вузька бічна панель, широка хед-секція або багатоколонкова сітка. За допомогою медіа-запитів вам довелося б писати специфічні правила для кожного з цих сценаріїв на основі ширини вікна перегляду. З контейнерними запитами картка може інтелектуально налаштовувати свій макет і стиль на основі розмірів батьківського контейнера, незалежно від загального розміру екрана.
Контейнерні запити пропонують кілька ключових переваг над традиційними медіа-запитами:
Давайте заглибимося в практичні аспекти використання контейнерних запитів. Перший крок – оголосити контейнер. Ви можете зробити це за допомогою властивості container-type на батьківському елементі:
Властивість container-type приймає кілька значень:
size: Контейнерні запити реагуватимуть як на вбудовані, так і на блокові розміри контейнера.inline-size: Контейнерні запити реагуватимуть лише на вбудований (ширину в горизонтальних режимах письма) розмір контейнера. Це найпоширеніший і часто найкорисніший варіант.block-size: Контейнерні запити реагуватимуть лише на блоковий (висоту в горизонтальних режимах письма) розмір контейнера.normal: Елемент не є контейнером запитів. Це значення за замовчуванням.style: Контейнерні запити реагуватимуть на запити стилю та запити за іменем контейнера (розглянуті пізніше), дозволяючи запитувати користувацькі властивості, встановлені на контейнері.Ось приклад визначення контейнера, який реагує на свій вбудований розмір:
.card-container {
container-type: inline-size;
}
Ви також можете використовувати скорочену властивість container, щоб вказати як container-type, так і container-name (яку ми обговоримо пізніше) в одному оголошенні:
.card-container {
container: card / inline-size;
}
У цьому випадку "card" – це назва контейнера.
Після того, як ви визначили контейнер, ви можете використовувати правило @container для написання запитів. Синтаксис схожий на медіа-запити, але замість націлювання на розміри вікна перегляду, ви націлюєтеся на розміри контейнера:
@container card (min-width: 400px) {
.card {
flex-direction: row;
}
.card__image {
width: 50%;
}
.card__content {
width: 50%;
}
}
У цьому прикладі ми націлюємося на контейнер "card" і застосовуємо стилі до елементів .card, .card__image та .card__content, коли ширина контейнера становить щонайменше 400px. Зверніть увагу на `card` перед `(min-width: 400px)`. Це важливо, коли ви назвали свій контейнер за допомогою `container-name` або скороченої властивості `container`.
Якщо ви не назвали свій контейнер, ви можете опустити назву контейнера:
@container (min-width: 400px) {
.card {
flex-direction: row;
}
.card__image {
width: 50%;
}
.card__content {
width: 50%;
}
}
Ви можете використовувати той самий діапазон медіа-функцій, які доступні в медіа-запитах, такі як min-width, max-width, min-height, max-height та орієнтація.
Називання ваших контейнерів може бути корисним, особливо при роботі з вкладеними контейнерами або складними макетами. Ви можете призначити ім'я контейнеру за допомогою властивості container-name:
.card-container {
container-name: card;
container-type: inline-size;
}
Потім у ваших контейнерних запитах ви можете націлити контейнер за його назвою:
@container card (min-width: 400px) {
/* Стилі для контейнера 'card' */
}
Запити стилю контейнера дозволяють реагувати на стиль вашого контейнера, а не на його розмір. Це особливо потужно в поєднанні з користувацькими властивостями. Спочатку ви повинні визначити свій контейнер за допомогою container-type: style:
.component-container {
container-type: style;
}
Потім ви можете використовувати @container style(--theme: dark), щоб запитати значення користувацької властивості --theme:
.component-container {
--theme: light;
}
@container style(--theme: dark) {
.component {
background-color: black;
color: white;
}
}
Це дозволяє вашим компонентам адаптуватися на основі конфігурації, встановленої за допомогою CSS, а не розміру вікна перегляду. Це відкриває великі можливості для тем і динамічного стилізування.
Давайте розглянемо кілька конкретних прикладів того, як контейнерні запити можуть використовуватися в реальних сценаріях:
Уявіть компонент картки, який відображає інформацію про продукт. У вузькому контейнері ми можемо захотіти розташувати зображення та вміст вертикально. У ширшому контейнері ми можемо відобразити їх пліч-о-пліч.
HTML:
CSS:
.card-container {
container-type: inline-size;
}
.card {
display: flex;
flex-direction: column;
border: 1px solid #ccc;
padding: 16px;
}
.card__image {
width: 100%;
margin-bottom: 16px;
}
.card__content {
width: 100%;
}
@container (min-width: 400px) {
.card {
flex-direction: row;
}
.card__image {
width: 50%;
margin-bottom: 0;
}
.card__content {
width: 50%;
}
}
У цьому прикладі картка спочатку відображатиме зображення та вміст, розташовані вертикально. Коли ширина контейнера досягне 400px, картка переключиться на горизонтальний макет.
Розглянемо навігаційне меню, яке має адаптуватися залежно від доступного простору. У вузькому контейнері (наприклад, мобільна бічна панель) ми можемо захотіти відобразити пункти меню у вертикальному списку. У ширшому контейнері (наприклад, настільний заголовок) ми можемо відобразити їх горизонтально.
HTML:
CSS:
.nav-container {
container-type: inline-size;
}
.nav {
list-style: none;
padding: 0;
margin: 0;
}
.nav__item {
margin-bottom: 8px;
}
.nav__item a {
display: block;
padding: 8px 16px;
text-decoration: none;
color: #333;
}
@container (min-width: 600px) {
.nav {
display: flex;
}
.nav__item {
margin-right: 16px;
margin-bottom: 0;
}
.nav__item a {
display: inline-block;
}
}
У цьому прикладі навігаційне меню спочатку відображатиме пункти у вертикальному списку. Коли ширина контейнера досягне 600px, меню переключиться на горизонтальний макет.
Уявіть макет статті, який має адаптуватися залежно від того, де він розміщений. Якщо в невеликому розділі попереднього перегляду зображення має бути над текстом. Якщо це основна стаття, зображення може бути збоку.
HTML
Article Title
Lorem ipsum dolor sit amet, consectetur adipiscing elit...
CSS
.article-container {
container-type: inline-size;
}
.article {
display: flex;
flex-direction: column;
}
.article-image {
width: 100%;
margin-bottom: 10px;
}
.article-content {
width: 100%;
}
@container (min-width: 768px) {
.article {
flex-direction: row;
}
.article-image {
width: 40%;
margin-right: 20px;
margin-bottom: 0;
}
.article-content {
width: 60%;
}
}
Підтримка контейнерних запитів зараз відмінна в сучасних браузерах, включаючи Chrome, Firefox, Safari та Edge. Важливо перевіряти Can I Use для отримання найновішої інформації про підтримку браузерами, оскільки функції та деталі реалізації можуть змінюватися.
Хоча контейнерні запити пропонують потужну альтернативу медіа-запитам, важливо розуміти, коли кожен підхід є найбільш доцільним.
У багатьох випадках ви, швидше за все, будете використовувати комбінацію як медіа-запитів, так і контейнерних запитів. Використовуйте медіа-запити для встановлення загального макета вашого застосунку, а потім використовуйте контейнерні запити для точного налаштування зовнішнього вигляду та поведінки окремих компонентів у межах цього макета.
CSS Container Queries представляють собою значний крок вперед в еволюції адаптивного дизайну. Дозволяючи адаптивність на основі елементів, вони дають розробникам можливість створювати більш гнучкі, багаторазові та підтримувані компоненти. Оскільки підтримка браузерами продовжує покращуватися, контейнерні запити готові стати важливим інструментом в арсеналі кожного веб-розробника.
Під час впровадження контейнерних запитів для глобальної аудиторії враховуйте наступне:
inline-start та inline-end замість фізичних властивостей, таких як left та right.em, rem), щоб забезпечити відповідне масштабування тексту.CSS Container Queries – це потужний інструмент для створення справді адаптивних та гнучких веб-застосунків. Застосовуючи адаптивний дизайн на основі елементів, ви можете створювати компоненти, які бездоганно адаптуються до різних контекстів, спрощувати свій код та покращувати загальний досвід користувача. Оскільки підтримка браузерами продовжує зростати, контейнерні запити готові стати фундаментальною частиною сучасної веб-розробки. Опануйте цю технологію, експериментуйте з її можливостями та відкрийте новий рівень гнучкості у своїх адаптивних дизайнах. Цей підхід дозволяє покращити повторне використання компонентів, зручність підтримки та більш інтуїтивний процес проектування, що робить його безцінним активом для фронтенд-розробників у всьому світі. Перехід до контейнерних запитів заохочує більш компонентно-орієнтований підхід до дизайну, що призводить до більш надійних та адаптованих веб-інтерфейсів для користувачів по всьому світу.